package com.ly.lypopupwindowdemo.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.ly.lypopupwindowdemo.R;

public class DesignPatternActivity extends AppCompatActivity {

    Button point1;
    TextView content1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_singleton);

        point1 = (Button) findViewById(R.id.point1);
        content1 = (TextView) findViewById(R.id.content1);

        String str1 = "";

        Singleton s1 = Singleton.instance;
        Singleton s2 = Singleton.instance;
        if (s1==s2){
            Toast.makeText(this, "s1和s2是同一个实例", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "s1和s2不是用一个实例", Toast.LENGTH_SHORT).show();
        }
        /**
         * 结果是s1和s2是同一个实例
         */

        /**
         * 工厂模式 老板
         */
        Car car = Driver.createCar("benz");
        car.setName("benz");
        car.drive();

    }


    /**
     * 懒汉式和饿汉式的区别
     * 饿汉式的特点是加载类的时候比较慢，但运行时获取对象的速度比较快  线程安全的
     * 懒汉式的特点是加载类时比较快，但运行时获取对象速度比较慢        线程不安全的
     */

    /**
     * 单例模式Singleton 饿汉式
     * 应用场合，有些对象只需要一个就足够了
     * 作用：保证整个应用程序中某个实例有且只有一个
     * 类型 懒汉式，饿汉式
     */

    public static class Singleton{

        /**
         * 第一步
         * 把构造方法设置成私有的，这样外界就无法直接通过new构造方法的方式来创造多个实例
         */
        private Singleton(){

        }

        /**
         * 第二步
         * 现在外部不能创建实例了，那么我们就自己创建一个
         * 创建类的唯一实例
         * 加private 不允许外部直接访问成员变量
         */
        /**
         * 饿汉式
         * static 类成员 类加载它就加载
         */
        private static Singleton instance= new Singleton();

        /**
         * 第三步 提供一个用于获取实例的方法
         */
        public static Singleton getInstace(){

            return instance;
        }

    }

    /**
     * 懒汉式
     */

    public static class Singleton2{
        /**
         * 第一步 将构造方法私有化
         */
        private Singleton2(){}
        /**
         * 第二步
         * 声明类的唯一实例，用private static修饰
         */
        private static Singleton2 instance2;

        /**
         * 第三步
         * 提供一个获取实例的方法
         */

        public static  Singleton2 getInstance(){
            if (instance2==null){
                instance2=new Singleton2();
            }
            return instance2;
        }
    }


    /**
     * 设计模式之工厂模式
     */

    /**
     * 抽象产品
     */
    abstract class Car{
        private String name;

        public abstract void drive();

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    /**
     * 具体产品
     */
    class Benz extends Car{

        @Override
        public void drive() {
            Toast.makeText(DesignPatternActivity.this, this.getName()+"go--------", Toast.LENGTH_SHORT).show();
        }
    }

    class Bmw extends Car{

        @Override
        public void drive() {
            Toast.makeText(DesignPatternActivity.this, this.getName()+"go--------", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 简单工厂
     */

    static class Driver{
        public static Car createCar(String car){
            Car c = null;
            if ("Benz".equalsIgnoreCase(car)){
               // c = new Benz();
            }else if ("Bmw".equalsIgnoreCase(car)){
                //c = new Bmw();
            }
            return c;
        }
    }









}
